#include "main.h"
#include "fdcan.h"  // 替换为FDCAN头文件
#include <stdint.h>



#ifndef CAN_MESSAGE_H
#define CAN_MESSAGE_H
// 定义CAN消息结构体
typedef struct {
    uint32_t id;         // CAN帧ID
    uint8_t len;         // 数据长度（0-8字节）
    uint8_t data[8];     // 数据内容
} CanMessage;
#endif

typedef void (*CanFrameCallback)(uint32_t can_id, uint8_t* data);

extern CanFrameCallback frame_callbacks[];  
extern uint32_t can_rx_count;
extern uint32_t can_rx_count_MCU1;
extern uint32_t can_rx_count_BMS;


// CAN帧类型枚举
typedef enum {
    CAN_FRAME_STANDARD = 0,
    CAN_FRAME_EXTENDED = 1
} CanFrameType;

// CAN过滤器配置（适配FDCAN）
typedef struct {
    const char* frame_name;       // 帧名称
    uint32_t can_id;              // CAN ID
    uint32_t filter_id;           // 过滤器ID（直接存储，无需移位）
    uint32_t filter_mask;         // 过滤器掩码（直接存储）
    uint8_t filter_bank;          // 过滤器组编号
    uint32_t min_interval;        // 最小接收间隔(ms)
} CanFrameFilterConfig;

// 静默中断时间结构体
typedef struct {
    uint32_t last_received_time;
    uint32_t min_interval;
} CanFrameTiming;

// 帧回调函数类型
typedef void (*CanFrameCallback)(uint32_t can_id, uint8_t* data);

// 信号格式枚举
typedef enum {
    SIGNAL_FORMAT_INTEL = 0,      // 小端格式
    SIGNAL_FORMAT_MOTOROLA = 1    // 大端格式
} SignalFormat;

// CAN信号定义结构
//typedef struct {
//    const char* name;             // 信号名称
//    uint32_t can_id;              // CAN ID
//    uint8_t start_byte;           // 起始字节
//    uint8_t start_bit;            // 起始位
//    uint8_t length;               // 信号长度（位）
//    float min_value;              // 最小值
//    float max_value;              // 最大值
//    float gain;                   // 增益
//    float offset;                 // 偏移量
//    const char* unit;             // 单位
//    const char* description;      // 描述
//    const char* frame_name;       // 帧名称
//    SignalFormat format;          // 信号格式
//    uint16_t min_send_interval;   // 最小发送间隔(ms)
//} CanSignalDef;

// 帧定义结构
typedef struct {
    const char* frame_name;       // 帧名称
    uint32_t can_id;              // CAN ID
    uint8_t data[8];              // 数据缓存
    CanFrameType frame_type;      // 帧类型
} CanFrameDef;

// 外部声明
extern CanFrameFilterConfig frame_filters[];
extern CanFrameCallback frame_callbacks[];
//extern const CanSignalDef signal_defs[];
extern const uint8_t signal_count;
extern CanFrameDef can1_frame_defs[];
extern CanFrameDef can2_frame_defs[];
extern const uint8_t can1_frame_count;
extern const uint8_t can2_frame_count;
extern CanFrameTiming frame_timings[];

// 函数声明
void init_can1_frame_callbacks(void);
void init_can2_frame_callbacks(void);
void config_can1_filters(FDCAN_HandleTypeDef *hcan);
void config_can2_filters(FDCAN_HandleTypeDef *hcan);
void init_can1_frames(void);
void init_can2_frames(void);
void parse_can1_received_frame(uint32_t id, uint8_t *data, CanFrameType frame_type);
void parse_can2_received_frame(uint32_t id, uint8_t *data, CanFrameType frame_type);


